TSM Adaptive Intraday Breakout (S) - разбор

Что это за стратегия

TSM Adaptive Intraday Breakout (S) - короткая внутридневная стратегия Кауфмана на основе двух нормализованных диапазонов. Она сравнивает текущий вынос цены вверх и вниз относительно цены period баров назад, нормализует эти выносы через period^apower и AverageTrueRange(period), а затем проверяет экстремумы этих нормализованных рядов за то же окно period.

Идея исходника:

  • если рынок показывает достаточно сильный положительный вынос вверх и одновременно отрицательный вынос вниз остается "внутри" порогов, стратегия покупает на закрытии бара;

  • если положительный вынос вверх остается слабым, а отрицательный вынос вниз становится достаточно большим по модулю, стратегия открывает шорт на закрытии бара.

Несмотря на суффикс (S), сам исходник содержит и buy, и sell short. Это значит, что стратегию нельзя считать чисто short-only без дополнительной проверки поведения платформы.

Исходный код

[LegacyColorValue = true]; { TSM Adaptive Intraday Breakout From Dennis Meyers, "Range Roving" (Active Trade, March 2003) Copyright 2011, P J Kaufman, All rights reserved. } Inputs: period(10), apower(0.75), highthreshold(.50), lowthreshold(1.05); vars: highrange(0), lowrange(0), nhr(0), nlr(0), hrmax(0), lrmax(0); { high and low ranges } highrange = high - low[period]; lowrange = low - high[period]; { lowrange = low - low[period]; } { normalized ranges } nhr = highrange/power(period,apower)/avgtruerange(period); nlr = lowrange/power(period,apower)/avgtruerange(period); hrmax = highest(nhr,period); lrmax = lowest(nlr,period); { trading signals } { buy when inside the threshold values } if hrmax > highthreshold and lrmax < lowthreshold then buy 1 contract this bar on close { sell when outside the threshold values } else if hrmax < highthreshold and lrmax > lowthreshold then sell short 1 contract this bar on close;

Разбор по шагам

1. Базовые диапазоны

highrange = High - Low[period] lowrange = Low - High[period]

highrange измеряет, насколько текущий максимум поднялся над минимумом period баров назад.

lowrange измеряет, насколько текущий минимум находится ниже максимума period баров назад.

Торговый смысл:

  • highrange фиксирует накопленный вынос вверх;

  • lowrange фиксирует накопленный вынос вниз.

В исходнике закомментирован альтернативный вариант:

lowrange = low - low[period]

Но активной формулой является именно low - high[period].

2. Нормализация диапазонов

nhr = highrange / power(period, apower) / AvgTrueRange(period) nlr = lowrange / power(period, apower) / AvgTrueRange(period)

Здесь оба диапазона делятся:

  1. на степенную функцию периода period^apower;

  2. на AverageTrueRange(period).

Торговый смысл:

  • стратегия старается сравнивать выносы не в "сырых" пунктах, а в масштабе текущей волатильности;

  • деление на period^apower дополнительно ослабляет зависимость порогов от длины окна.

3. Экстремумы нормализованных рядов

hrmax = Highest(nhr, period) lrmax = Lowest(nlr, period)

За последние period баров берутся:

  • максимум нормализованного верхнего диапазона nhr;

  • минимум нормализованного нижнего диапазона nlr.

Важно:

  • lrmax в исходнике назван как max, но считается через Lowest, то есть это самый отрицательный или самый малый уровень ряда nlr.

4. Условие входа в лонг

hrmax > highthreshold and lrmax < lowthreshold

При выполнении этих условий система делает:

buy 1 contract this bar on close

Что понятно уверенно:

  • вход происходит на закрытии текущего бара;

  • размер позиции в исходнике фиксированный: 1 contract;

  • лонг появляется, когда верхний вынос достаточно силен относительно порога highthreshold.

Что не до конца очевидно:

  • комментарий buy when inside the threshold values не полностью совпадает с формулой, потому что первая часть требует hrmax > highthreshold, то есть явный выход выше порога.

5. Условие входа в шорт

hrmax < highthreshold and lrmax > lowthreshold

При выполнении этих условий система делает:

sell short 1 contract this bar on close

Здесь возникает важная неоднозначность.

Если nlr = lowrange / ..., а lowrange = low - high[period], то nlr обычно будет отрицательным или малым числом. Тогда условие:

lrmax > 1.05

выглядит нетипично и на реальных данных может выполняться крайне редко или не выполняться вовсе.

Возможные объяснения:

  1. в исходнике допущена опечатка, и для шорта ожидалось сравнение другого знака;

  2. комментарий или один из порогов исторически менялись, а текст остался в промежуточной версии;

  3. автор действительно использовал асимметричную шкалу и рассчитывал на редкие сигналы.

6. Логика выхода

В исходнике явных sell, buy to cover, stop, profit target или временных выходов нет.

Значит, возможны только такие трактовки:

  1. позиция переворачивается противоположным входом;

  2. позиция удерживается до обратного сигнала;

  3. часть выходной логики находилась в настройках платформы, а не в тексте;

  4. текст является фрагментом более полной системы.

Для TSLab это значит, что поведение выхода нужно сделать явным и задокументировать.

Что понятно уверенно

  • Используются только стандартные ценовые ряды и AverageTrueRange(period).

  • Нужны исторические ссылки Low[period] и High[period].

  • Нужны Highest и Lowest по фиксированному окну period.

  • Входы происходят по рынку на закрытии текущего бара.

  • Авторский размер позиции фиксирован и равен 1.

  • Явного авторского стоп-лосса в тексте нет.

Что остается не до конца очевидным

  • Суффикс (S) не согласуется с наличием лонгового входа в исходнике.

  • Комментарии inside/outside threshold values не полностью совпадают с буквальным поведением условий.

  • Условие lrmax > lowthreshold для шорта выглядит подозрительно с учетом того, что lrmax = Lowest(nlr, period).

  • В исходнике нет явных правил закрытия позиции, кроме потенциального переворота противоположным сигналом.

  • Не указан исходный инструмент и таймфрейм.

Торговый смысл формул

  • High - Low[period] измеряет силу смещения вверх относительно исторической опоры.

  • Low - High[period] измеряет силу смещения вниз относительно противоположной границы окна.

  • Деление на ATR(period) переводит выносы в волатильностную шкалу.

  • Деление на period^apower сглаживает влияние длины окна и делает пороги более переносимыми между разными period.

  • Highest(nhr, period) и Lowest(nlr, period) ищут не одномоментный вынос, а экстремальный характер движения за все окно.

Итог

Стратегия может быть перенесена в TSLab без новых кастомных индикаторов:

  1. стандартные блоки High, Low, Close, ATR, Highest, Lowest;

  2. блоки Формула для исторических ссылок, степенной нормализации и булевых условий;

  3. торговые блоки рыночного входа и явных выходов.

Главная инженерная задача при переносе - не расчет индикаторов, а явная фиксация выходной логики и риск-модели, потому что в исходнике они заданы неполно.